package com.monitor.log;

import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 网页访问日志，记录用户访问的网页内容
 */
public class WebAccessLog {
    private static final DateTimeFormatter TIME_FORMATTER = 
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter FILE_DATE_FORMATTER = 
            DateTimeFormatter.ofPattern("yyyyMMdd");
    
    private String logDirectory;
    private int retentionDays; // 日志保留天数
    
    public WebAccessLog() {
        // 默认设置
        this.logDirectory = System.getProperty("user.home") + File.separator + "WebAccessLogs";
        this.retentionDays = 7; // 默认保留7天
        
        // 确保日志目录存在
        File dir = new File(logDirectory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
    }
    
    /**
     * 记录网页访问
     * @param url 访问的URL
     * @param title 网页标题
     * @param content 网页内容摘要
     */
    public void logAccess(String url, String title, String content) {
        try {
            // 获取当前日期作为文件名
            String fileName = LocalDateTime.now().format(FILE_DATE_FORMATTER) + ".log";
            File logFile = new File(logDirectory, fileName);
            
            // 创建日志条目
            String timestamp = LocalDateTime.now().format(TIME_FORMATTER);
            String logEntry = String.format("[%s] URL: %s\nTitle: %s\nContent: %s\n\n", 
                    timestamp, url, title, content);
            
            // 写入日志文件
            try (FileWriter fw = new FileWriter(logFile, true);
                 BufferedWriter bw = new BufferedWriter(fw)) {
                bw.write(logEntry);
            }
            
            // 清理过期日志
            cleanupOldLogs();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 按日期获取日志
     * @param date 日期（格式：yyyyMMdd）
     * @return 日志内容列表
     */
    public List<String> getLogsByDate(String date) {
        List<String> logs = new ArrayList<>();
        
        File logFile = new File(logDirectory, date + ".log");
        if (!logFile.exists()) {
            return logs;
        }
        
        try (BufferedReader br = new BufferedReader(new FileReader(logFile))) {
            StringBuilder entry = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                if (line.trim().isEmpty() && entry.length() > 0) {
                    logs.add(entry.toString());
                    entry = new StringBuilder();
                } else {
                    entry.append(line).append("\n");
                }
            }
            
            // 添加最后一个条目（如果有）
            if (entry.length() > 0) {
                logs.add(entry.toString());
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return logs;
    }
    
    /**
     * 清理过期日志
     */
    private void cleanupOldLogs() {
        File dir = new File(logDirectory);
        if (!dir.exists() || !dir.isDirectory()) {
            return;
        }
        
        // 获取当前日期
        LocalDateTime now = LocalDateTime.now();
        
        // 遍历目录中的所有日志文件
        File[] files = dir.listFiles((d, name) -> name.matches("\\d{8}\\.log"));
        if (files != null) {
            for (File file : files) {
                try {
                    // 从文件名中提取日期
                    String dateStr = file.getName().substring(0, 8);
                    LocalDateTime fileDate = LocalDateTime.parse(dateStr, FILE_DATE_FORMATTER);
                    
                    // 如果文件超过保留天数，则删除
                    if (fileDate.plusDays(retentionDays).isBefore(now)) {
                        if (file.delete()) {
                            System.out.println("已删除过期日志: " + file.getName());
                        }
                    }
                } catch (Exception e) {
                    // 如果解析文件名失败，忽略该文件
                    e.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 设置日志保存目录
     * @param directory 保存目录路径
     */
    public void setLogDirectory(String directory) {
        this.logDirectory = directory;
        File dir = new File(logDirectory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
    }
    
    /**
     * 设置日志保留天数
     * @param days 保留天数（最长14天）
     */
    public void setRetentionDays(int days) {
        if (days >= 1 && days <= 14) {
            this.retentionDays = days;
        }
    }
    
    /**
     * 获取日志保存目录
     * @return 保存目录路径
     */
    public String getLogDirectory() {
        return logDirectory;
    }
    
    /**
     * 获取日志保留天数
     * @return 保留天数
     */
    public int getRetentionDays() {
        return retentionDays;
    }
}